home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Reverse Code Engineering RCE CD +sandman 2000
/
ReverseCodeEngineeringRceCdsandman2000.iso
/
RCE
/
Library
/
Window Info
/
WINLOAD.TXT
< prev
Wrap
Text File
|
2000-05-25
|
7KB
|
149 lines
Self-Loading Windows Applications Overview (3.1)
This topic describes the contents of a unique segment that is
found only in self-loading applications for the Windows
operating system. This segment contains six functions: three
that the application developer supplies and three that the
Windows kernel supplies. The segment also contains a table of
pointers to these functions and loader code.
This topic contains references to the Windows (new-style)
header and the data tables in a Windows executable file.
Loader Functions
The Windows kernel provides a loader function that places
applications into memory and passes execution to a specified
entry point. Some Windows applications, however, must bypass
this kernel function and load themselves in order to be
executed correctly. For example, a compiler for Windows might
contain two floating-point modules: one requiring a math
coprocessor and one emulating the coprocessor. The standard
loader function in the Windows kernel does not provide a
method of specifying that code in one module should be loaded
in place of code in another; this means that the compiler
needs to load the appropriate code itself in order to run
efficiently and correctly. Likewise, the code for a Windows
application might be compressed with a special compression
algorithm in order to fit on a certain number of disks, but
the standard loader function does not provide a method for
dealing with a compressed file format. The application,
therefore, must load itself in order to be executed
correctly.
To indicate that a Windows application is self-loading, the
16-bit flag value in the executable file's Windows header
must contain the value 0x0800 (that is, bit 11 must be set).
Otherwise, Windows ignores the private loader code and
installs the application by using the standard loader
functions in the Windows kernel.
Loader Data Table
In addition to the loader functions, the first segment of a
self-loading Windows application contains a loader data table
with far pointers to each of the loader functions. The format
of this table follows:
Location Description
0x00 Specifies the version number (this value must be
0xA0).
0x02 Reserved.
0x04 Points to a startup procedure, which the application
developer provides.
0x08 Points to a reloading procedure, which the
application developer provides.
0x0C Reserved.
0x10 Points to a memory-allocation procedure, which the
kernel provides.
0x14 Points to an entry-number procedure, which the kernel
provides.
0x18 Points to an exit procedure, which the application
developer provides.
0x1C Reserved.
0x1E Reserved.
0x20 Reserved.
0x22 Reserved.
0x24 Points to a set-owner procedure, which the kernel
provides.
All of the pointers in this table must point to locations
within the first segment. There can be no fixups outside this
segment.
After the segment table for an executable file is loaded into
memory, each entry contains an additional 16-bit value. This
value is a segment selector (or handle) that the loader
created.
Loader Code
The first segment of a self-loading Windows application
contains loader code for the six required loader functions.
The code loads and reloads segments and resets hardware.
Loading Segments
The kernel calls the BootApp function supplied by the
application developer, instead of loading the application in
the normal manner, if the 16-bit value in the information
block for the Windows header contains the value 0x0800 (that
is, bit 11 is set). The BootApp function allocates memory for
all segments by calling the kernel-supplied MyAlloc function.
If the segment is identified as a PRELOAD or FIXED type,
BootApp also calls the LoadAppSeg function (another function
supplied by the application developer). The BootApp function
also calls SetOwner, a kernel-supplied function, to associate
the correct information block with each segment handle.
The first segment that the BootApp function should allocate
is the application's automatic data segment. This data
segment contains the application's stack. The automatic data
segment must be allocated before the BootApp function calls
the Windows PatchCodeHandle function.
Reloading Segments
In addition to loading segments, the LoadAppSeg function
reloads segments that the Windows kernel has discarded.
Because the LoadAppSeg function is responsible for reloading
segments, it must update bits 1 and 2 of the 16-bit flag
value in the segment table. (Only self-loading applications
should alter the Windows header or the data tables that
follow it.) Bit 1 specifies whether memory is allocated for
the segment, and bit 2 specifies whether the segment is
currently loaded. For a complete description of the segment
table, see Executable-File Format.
If the loader allocates memory for a segment but the segment
is not loaded (that is, bit 1 is set and bit 2 is not), the
LoadAppSeg function should call the Windows GlobalHandle
function to determine whether memory is allocated for the
segment. If memory is not allocated, the LoadAppSeg function
should call the Windows GlobalReAlloc function to reallocate
memory for the segment.
Once memory is allocated, the LoadAppSeg function should read
the segment from the executable file and call the
PatchCodeHandle function to correct each function prolog that
occurs in the segment. Once the function prologs are altered,
the LoadAppSeg function should resolve any far pointers that
occur in the segment. If the pointer is specified by an
ordinal value, the LoadAppSeg function should call the
kernel-supplied EntryAddrProc function to resolve the
address.
Resetting Hardware
When closing a self-loading application, the kernel calls the
ExitProc function, supplied by the application developer, to
reset any hardware that a dynamic-link library may have
accessed. However, the ExitProc function does not need to
free memory or close files.
Function Reference
This section provides information about the functions
supplied by the application developer and by the kernel for
self-loading Windows applications.
See Also
BootApp, EntryAddrProc, ExitProc, MyAlloc, PatchCodeHandle,
LoadAppSeg, SetOwner